package com.hdw.job.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.hdw.common.base.BaseException;
import com.hdw.common.util.DBUtil;
import com.hdw.common.util.DateUtil;
import com.hdw.common.util.SnowflakeIdWorker;
import com.hdw.common.vo.DataExecParamVO;
import com.hdw.common.vo.PaginationVO;
import com.hdw.job.api.EtlTaskOdsService;
import com.hdw.job.bean.model.EtlTaskOds;
import com.hdw.job.constant.JobConstant;
import com.hdw.job.mapper.EtlTaskOdsMapper;
import com.hdw.med.api.MdMedTbService;
import com.hdw.med.api.TableDDLService;
import com.hdw.med.bean.vo.TableDDLColumnVO;
import com.hdw.med.bean.vo.TableDDLSqlVO;
import com.hdw.med.bean.vo.TableDDLVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * etlTaskOds服务实现类
 * Created by eleven on 2021/11/24.
 */
@Service
@Transactional
public class EtlTaskOdsServiceImpl implements EtlTaskOdsService {

    private static final Logger LOGGER = LoggerFactory.getLogger(EtlTaskOdsServiceImpl.class);

    @Autowired
    EtlTaskOdsMapper etlTaskOdsMapper;
    @Autowired
    MdMedTbService mdMedTbService;
    @Autowired
    TableDDLService tableDDLService;
   /* @Autowired
    EtlTaskDwService etlTaskDwService;*/


    @Override
    public int insert(EtlTaskOds etlTaskOds) {
        if (etlTaskOds.getIdTaskOds() == null) {
            Long uuid32 = SnowflakeIdWorker.getId();
            etlTaskOds.setIdTaskOds(uuid32);
        }
        return etlTaskOdsMapper.insert(etlTaskOds);
    }

    @Override
    public int insertSelective(EtlTaskOds etlTaskOds) {
        if (etlTaskOds.getIdTaskOds() == null) {
            Long uuid32 = SnowflakeIdWorker.getId();
            etlTaskOds.setIdTaskOds(uuid32);
        }
        return etlTaskOdsMapper.insertSelective(etlTaskOds);
    }

    @Override
    public int deleteById(Long idTaskOds) throws BaseException {
        EtlTaskOds etlTaskOds = etlTaskOdsMapper.selectByPrimaryKey(idTaskOds);
        if (etlTaskOds == null) return 0;

        /*EtlTaskDw etlTaskDw = etlTaskDwService.getEtlTaskDwByIdTaskOds(idTaskOds);
        if (etlTaskDw != null) throw new BaseException(String.format("名称为：[%s]的DW正在使用!", etlTaskDw.getNa()));*/

        if (!StringUtils.isEmpty(etlTaskOds.getTbTar())) {
            if (DBUtil.tableIsExist(etlTaskOds.getTbTar(), DBUtil.DB_DW))
                DBUtil.dropTable(etlTaskOds.getTbTar(), DBUtil.DB_DW);
        }
        return etlTaskOdsMapper.deleteByPrimaryKey(idTaskOds);
    }

    @Override
    public int updateByIdSelective(EtlTaskOds etlTaskOds) throws BaseException {
        EtlTaskOds etlTaskOdsOld = etlTaskOdsMapper.selectByPrimaryKey(etlTaskOds.getIdTaskOds());
        if (etlTaskOdsOld == null) return 0;
        if (!StringUtils.isEmpty(etlTaskOds.getTbTar()) && !StringUtils.isEmpty(etlTaskOdsOld.getTbTar()) && etlTaskOds.getTbTar().equals(etlTaskOdsOld.getTbTar()))
            if (DBUtil.tableIsExist(etlTaskOds.getTbTar(), DBUtil.DB_DW) && DBUtil.tableIsExist(etlTaskOdsOld.getTbTar(), DBUtil.DB_DW)) {
                DBUtil.renameTable(etlTaskOdsOld.getTbTar(), etlTaskOds.getTbTar(), DBUtil.DB_DW);
            }

        return etlTaskOdsMapper.updateByPrimaryKeySelective(etlTaskOds);
    }

    @Override
    public int updateById(EtlTaskOds etlTaskOds) {
        return etlTaskOdsMapper.updateByPrimaryKey(etlTaskOds);
    }

    @Override
    public EtlTaskOds getById(Long idTaskOds) {
        return etlTaskOdsMapper.selectByPrimaryKey(idTaskOds);
    }

    @Override
    public List<EtlTaskOds> findByModel(EtlTaskOds etlTaskOds) {
        return etlTaskOdsMapper.findByModelWithBLOBs(etlTaskOds);
    }

    @Override
    public PaginationVO<EtlTaskOds> findPageByModel(EtlTaskOds etlTaskOds, Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum == null ? 1 : pageNum, pageSize == null ? 10 : pageSize);
        List<EtlTaskOds> quesList = etlTaskOdsMapper.findByModelWithBLOBs(etlTaskOds);
        PageInfo<EtlTaskOds> pageInfo = new PageInfo<>(quesList);
        PaginationVO<EtlTaskOds> paginationVo = new PaginationVO(pageInfo.getTotal(), pageInfo.getList());
        return paginationVo;
    }


    @Override
    public PaginationVO<EtlTaskOds> findByModelWithBLOBs(EtlTaskOds etlTaskOds, Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum == null ? 1 : pageNum, pageSize == null ? 10 : pageSize);
        List<EtlTaskOds> quesList = etlTaskOdsMapper.findByModelWithBLOBs(etlTaskOds);
        PageInfo<EtlTaskOds> pageInfo = new PageInfo<>(quesList);
        PaginationVO<EtlTaskOds> paginationVo = new PaginationVO(pageInfo.getTotal(), pageInfo.getList());
        return paginationVo;
    }

    @Override
    public List<DataExecParamVO> findParamVOS(String startDate,String endDate) {
        List<DataExecParamVO> paramVOList = new ArrayList<>();
        EtlTaskOds odsModel = new EtlTaskOds();
        odsModel.setFgStop("0");
        List<EtlTaskOds> taskOdsList = this.findByModel(odsModel);
        return assembleParamVOS(taskOdsList,startDate,endDate);
    }

    public List<DataExecParamVO> findParamVOS(List<String> ids,String startDate,String endDate) {
        List<DataExecParamVO> paramVOList = new ArrayList<>();
        EtlTaskOds odsModel = new EtlTaskOds();
        odsModel.setFgStop("0");
        List<EtlTaskOds> taskOdsList =new ArrayList<>();
        EtlTaskOds etlTaskOds;
        for(String id:ids) {
            if(StringUtils.isEmpty(id)) {
                continue;
            }
            etlTaskOds = this.getById(Long.parseLong(id));
            taskOdsList.add(etlTaskOds);
        }
        return assembleParamVOS(taskOdsList,startDate,endDate);
    }

    private List<DataExecParamVO> assembleParamVOS(List<EtlTaskOds> taskOdsList,String startDate,String endDate) {
        List<DataExecParamVO> paramVOList = new ArrayList<>();
        DataExecParamVO param;
        try {
            Date start = DateUtil.toDateByFormat(startDate, DateUtil.yyyyMMdd);
            Date end = DateUtil.toDateByFormat(endDate,DateUtil.yyyyMMdd);
            for(EtlTaskOds elTaskOds:taskOdsList) {
                String jobType;
                String tarDb;
                if (elTaskOds.getEuType().equalsIgnoreCase(JobConstant.JOB_TYPE_ODS)) {
                    jobType = JobConstant.JOB_TYPE_ODS;
                    tarDb = DBUtil.DB_DW;
                } else {
                    jobType = JobConstant.JOB_TYPE_DIM;
                    tarDb = DBUtil.META_DB;
                }
                String taskDes = elTaskOds.getNaTaskOds() + "[" + elTaskOds.getDesEvent() + "]";
                param = new DataExecParamVO();
                param.setAfterSql(elTaskOds.getAfterSql());
                param.setDelSql(elTaskOds.getBeforSql());
                param.setStartDate(DateUtil.toDateStrByFormat(start, "yyyy-MM-dd HH:mm:ss"));
                param.setEndDate(DateUtil.toDateStrByFormat(end, "yyyy-MM-dd HH:mm:ss"));
                param.setTbTar(elTaskOds.getTbTar());
                param.setQuerySql(elTaskOds.getQsql());
                param.setDes(taskDes);
                param.setJobType(jobType);
                param.setIdDbSou(elTaskOds.getIdDbSou().toString());
                param.setIdDbTar(tarDb);
                paramVOList.add(param);
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
        return paramVOList;
    }

    @Override
    public TableDDLSqlVO createOrModiTableSQL(Long idTaskOds) throws BaseException, IllegalAccessException {
        EtlTaskOds etlTaskOds = etlTaskOdsMapper.selectByPrimaryKey(idTaskOds);
        if (etlTaskOds == null) throw new BaseException(String.format("ODS配置记录未找到,idTaskOds:[%s]", idTaskOds));

        String odsQuerySql = etlTaskOds.getQsql();
        String tbTar = etlTaskOds.getTbTar();

        TableDDLSqlVO createTableDDLVO = tableDDLService.generateTableDDLSQL(odsQuerySql, etlTaskOds.getIdDbSou().toString(), tbTar, DBUtil.DB_DW);

        return createTableDDLVO;
    }

    @Override
    public List<TableDDLColumnVO> createOrModiTableColumnList(Long idTaskOds) throws BaseException, IllegalAccessException {
        EtlTaskOds etlTaskOds = etlTaskOdsMapper.selectByPrimaryKey(idTaskOds);
        if (etlTaskOds == null) throw new BaseException(String.format("ODS配置记录未找到,idTaskOds:[%s]", idTaskOds));

        String odsQuerySql = etlTaskOds.getQsql();
        String tbTar = etlTaskOds.getTbTar();

        List<TableDDLColumnVO> createTableDDLVO = tableDDLService.generateTableDDLColumnList(odsQuerySql, etlTaskOds.getIdDbSou().toString(), tbTar, DBUtil.DB_DW);

        return createTableDDLVO;
    }

    @Override
    public void execTableDDLColumns(TableDDLVO opTable) throws BaseException, IllegalAccessException {
        EtlTaskOds etlTaskOds = etlTaskOdsMapper.selectByPrimaryKey(Long.parseLong(opTable.getTaskId()));
        if (etlTaskOds == null)
            throw new BaseException(String.format("ODS配置记录未找到,idTaskOds:[%s]", opTable.getTaskId()));
        if (StringUtils.isEmpty(etlTaskOds.getTbTar()))
            throw new BaseException(String.format("ODS配置记录目标表未找到,idTaskOds:[%s][%s]", opTable.getTaskId(), etlTaskOds.getTbTar()));


        tableDDLService.execTableDDLColumnListOfDW(opTable.getColumns(), etlTaskOds.getTbTar().toUpperCase());
    }

    @Override
    public void execTableDDLSQL(Long idTaskOds, int execType) throws BaseException, IllegalAccessException {
        TableDDLSqlVO createTableDDLVO = this.createOrModiTableSQL(idTaskOds);
        String sql = null;
        if (execType == 1) {
            sql = createTableDDLVO.getCreateSQL();
        } else if (execType == 2) {
            sql = createTableDDLVO.getModifySQL();
        }
        tableDDLService.execTableDDLSQLOfDW(sql);
    }
}
